/**
 * 时间格式化工具函数
 * @param timestamp 时间戳（毫秒）
 * @returns 格式化后的时间字符串
 */
export const formatTimeAgo = (timestamp: number): string => {
  const now = Date.now();
  const diff = now - timestamp;

  // 如果时间戳是未来时间，返回"刚刚"
  if (diff < 0) {
    return '刚刚';
  }

  // 计算时间差
  const seconds = Math.floor(diff / 1000);
  const minutes = Math.floor(seconds / 60);
  const hours = Math.floor(minutes / 60);
  const days = Math.floor(hours / 24);
  const weeks = Math.floor(days / 7);
  const months = Math.floor(days / 30);
  const years = Math.floor(days / 365);

  // 根据时间差返回相应的格式
  if (years > 0) {
    return `${years}年前`;
  } else if (months > 0) {
    return `${months}个月前`;
  } else if (weeks > 0) {
    return `${weeks}周前`;
  } else if (days > 0) {
    return `${days}天前`;
  } else if (hours > 0) {
    return `${hours}小时前`;
  } else if (minutes > 0) {
    return `${minutes}分钟前`;
  } else {
    return '刚刚';
  }
};

/**
 * 格式化时间戳为相对时间（支持字符串时间戳）
 * @param time 时间戳（毫秒）或时间字符串
 * @returns 格式化后的时间字符串
 */
export const formatRelativeTime = (time: number | string): string => {
  let timestamp: number;

  if (typeof time === 'string') {
    // 如果是字符串，尝试转换为时间戳
    timestamp = new Date(time).getTime();

    // 如果转换失败，返回原字符串
    if (isNaN(timestamp)) {
      return time;
    }
  } else {
    timestamp = time;
  }

  return formatTimeAgo(timestamp);
};

/**
 * 格式化时间戳为具体日期
 * @param timestamp 时间戳（毫秒）
 * @param format 格式类型 'date' | 'datetime' | 'time'
 * @returns 格式化后的时间字符串
 */
export const formatDateTime = (
  timestamp: number,
  format: 'date' | 'datetime' | 'time' = 'datetime'
): string => {
  const date = new Date(timestamp);

  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  const hours = String(date.getHours()).padStart(2, '0');
  const minutes = String(date.getMinutes()).padStart(2, '0');
  const seconds = String(date.getSeconds()).padStart(2, '0');

  switch (format) {
    case 'date':
      return `${year}-${month}-${day}`;
    case 'time':
      return `${hours}:${minutes}:${seconds}`;
    case 'datetime':
    default:
      return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
  }
};
